package com.wkq.util;

/**
 * @Author: wkq
 * @Time: 2025/4/27 12:18
 * @Desc:
 */
import java.util.List;
import java.util.Random;

public class RandomUtils {

    private static Random random;

    /**
     * 设置随机因子（种子）
     * @param seed 随机因子
     */
    public static void setSeed(long seed) {
        random = new Random(seed);
    }

    /**
     * 使用默认随机因子
     */
    public static void useDefaultSeed() {
        random = new Random();
    }

    /**
     * 生成指定范围内的随机整数
     * @param min 最小值（包含）
     * @param max 最大值（包含）
     * @return 随机整数
     */
    public static int getRandomInt(int min, int max) {
        if (min > max) {
            throw new IllegalArgumentException("最小值不能大于最大值");
        }
        if (random == null) {
            useDefaultSeed();
        }
        return random.nextInt(max - min + 1) + min;
    }

    /**
     * 生成指定范围内的随机浮点数
     * @param min 最小值（包含）
     * @param max 最大值（不包含）
     * @return 随机浮点数
     */
    public static float getRandomFloat(float min, float max) {
        if (min > max) {
            throw new IllegalArgumentException("最小值不能大于最大值");
        }
        if (random == null) {
            useDefaultSeed();
        }
        return min + random.nextFloat() * (max - min);
    }

    /**
     * 生成随机布尔值
     * @return 随机布尔值
     */
    public static boolean getRandomBoolean() {
        if (random == null) {
            useDefaultSeed();
        }
        return random.nextBoolean();
    }

    /**
     * 从数组中随机选择一个元素
     * @param array 数组
     * @param <T> 数组元素类型
     * @return 随机选择的元素
     */
    public static <T> T getRandomElement(T[] array) {
        if (array == null || array.length == 0) {
            return null;
        }
        if (random == null) {
            useDefaultSeed();
        }
        int randomIndex = random.nextInt(array.length);
        return array[randomIndex];
    }

    /**
     * 从列表中随机选择一个元素
     * @param list 列表
     * @param <T> 列表元素类型
     * @return 随机选择的元素
     */
    public static <T> T getRandomElement(List<T> list) {
        if (list == null || list.isEmpty()) {
            return null;
        }
        if (random == null) {
            useDefaultSeed();
        }
        int randomIndex = random.nextInt(list.size());
        return list.get(randomIndex);
    }
}